// middleware/error_handler.go
package middleware

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// ErrorHandler 是一个Gin中间件，用于统一处理错误
func ErrorHandler(logger *zap.Logger) gin.HandlerFunc {
	return func(c *gin.Context) {
		defer func() {
			if err := recover(); err != nil {
				// 记录错误日志
				logger.Error("服务器内部错误", zap.Any("error", err))

				// 返回统一的错误响应
				c.JSON(http.StatusInternalServerError, gin.H{
					"code":    http.StatusInternalServerError,
					"message": "服务器内部错误",
				})

				// 终止请求处理链
				c.Abort()
			}
		}()

		// 继续处理请求
		c.Next()

		// 处理自定义错误
		if len(c.Errors) > 0 {
			// 记录错误日志
			for _, e := range c.Errors {
				logger.Error("请求处理错误", zap.String("error", e.Error()))
			}

			// 返回第一个错误
			firstError := c.Errors[0]
			c.JSON(http.StatusBadRequest, gin.H{
				"code":    http.StatusBadRequest,
				"message": firstError.Error(),
			})
			c.Abort()
		}
	}
}
